package com.bytezero.throwable;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

/**
 * 
 * @Description   异常处理 ：
 * @author Bytezero·zhenglei!        Email:420498246@qq.com
 * @version
 * @date 上午8:35:40
 * @     一：异常处理 ： 抓抛模型
 * 
 *  过程一： “抛”：程序在正常执行的过程中，一旦出现异常，就会在异常代码处生成
 *  一个对应异常类的对象。并将此对象输出。
 *   一旦抛出对象以后，其后的代码不再执行。
 *   
 *   关于异常对象的产生：① 系统自动生成的异常对象
 *                      ② 手动生成一个异常对象，并抛出 throw。
 *   
 *   
 *   
 * 
 *   过程二：“抓”：可以理解为 异常的处理方式，：①try-catch-finally  ②throws
 *   
 *   
 *   二：try-catch-finally的使用
 *   
 *   try{
 *   
 *   		//可能出现异常的代码
 *   
 *   }catch(异常类型1 变量名1){
 *   
 *       //处理异常的方式1
 *   
 *   }catch(异常类型2 变量名2){
 *   
 *       //处理异常的方式2
 *   
 *   }catch(异常类型3 变量名3){
 *   
 *       //处理异常的方式3
 *   
 *   }
 *   .....
 *   finally{
 *   
 *   		//一定会执行的代码
 *   }
 *   
 *   说明：
 *   1.finally是可选的。
 *   2.使用try将可能出现的代码包装起来，在执行过程中，一旦出现异常，就会生成
 *   一个对应异常的对象，根据此对象的类型，去catch中进行匹配
 *   3.一旦try中的异常对象匹配到某一个catch时，就进入catch中进行异常的处理。一旦
 *   处理完成后，一旦处理完成，就跳出当前的try  catc 结构（在没有写finally的情况）。继续
 *   执行其后的代码
 *   4.catch中的异常类型 如果没有子父类关系，则说声明在上，都可以
 *     catch中的异常类型 如果满足子父类关系，则要求子类一定声明在父类的上面，否则，报错
 *
 *   5.常用的异常对象处理方式：①String getMessage()  
 *                            ②printStackTrace()
 * 
 *   6.在try结构中声明的变量，再出了try结构以后，就不能再被调用
 *   
 *   7.try - catch-finally结构可以相互嵌套。
 *   
 *   
 *   体会1：使用try-catch-finally处理编译异常时，使得程序在编译时就不在报错，但是运行时仍可能
 *   报错，相当于我们使用try - catch -finally 将一个编译时可能出现的异常，延迟到运行时出现。
 *
 *
 *   体会2：开发中，由于运行时异常比较常见，所有我们通常就不针对运行时异常编写try-catch-finally了,
 *   针对于编译时异常，我们说一定要考虑异常的处理。
 *  
 */
public class ExceptionTest2 {
	
	
	@Test
	public void test2() {
		
		try {
			
				File file = new File("hello.txt");
				FileInputStream fis = new FileInputStream(file);
				
				int data = fis.read();
				while(data != -1) {
					System.out.println((char)data);
					data = fis.read();
					
				}
				fis.close();
		}catch(FileNotFoundException e){
			
			e.printStackTrace();
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
	@Test
	public void test1() {
		
		String str = "123"; 
		str = "abc";
		int num = 0;
		try {
			 Integer.parseInt(str);
			
			System.out.println("Hello----------1");
		
		}catch(NullPointerException e) {
			System.out.println("出现了空指针异常");
			
		}catch(NumberFormatException e) {
			
//			System.out.println("出现 数值转换 异常了");
			//String getMessage():
			//System.out.println(e.getMessage());
			//printStackTrace
			e.printStackTrace(); 
			
		}catch(Exception e) {
			
			System.out.println("出现了 异常 ");
		}
		
		//System.out.println(num);  //不可以调用，因为出了 try 结构
		
		System.out.println(num);
		
		System.out.println("Hello----------2");
		
	}
	
	
	
	

}
